﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Web.Security;
using ankietyzacja.Logic;

namespace ankietyzacja.Dao
{
    public class UzytkownikDao : Dao
    {


        public UzytkownikDao(SqlConnection c, SqlTransaction t)
            : base(c, t)
        {
        }


        public DataTable loadForNumerAlbumu(Int32 numerAlbumu)
        {

            String sql =
        @" SELECT *
             FROM UZYTKOWNIK
     WHERE NUMERALBUMU = @NUMERALBUMU;
     ";
            SqlCommand command = new SqlCommand(sql, connection, transaction);
            command.Parameters.Add(new SqlParameter("@NUMERALBUMU", numerAlbumu));


            DataTable dataTable = new DataTable();

            new SqlDataAdapter(command).Fill(dataTable);

            return dataTable;

        }

        public DataTable loadForEmail(String email)
        {

            String sql =
        @" SELECT *
             FROM aspnet_Membership
     WHERE LoweredEmail = LOWER(@EMAIL);
     ";
            SqlCommand command = new SqlCommand(sql, connection, transaction);
            command.Parameters.Add(new SqlParameter("@EMAIL", email));


            DataTable dataTable = new DataTable();

            new SqlDataAdapter(command).Fill(dataTable);

            return dataTable;

        }


        public AnkietyzacjaMembershipUser utworzMembership(String userName, String email)
        {
            String password = Membership.GeneratePassword(8, 1);

            MembershipUser newUser = Membership.CreateUser(userName, password, email);

            AnkietyzacjaMembershipUser ankietyzacjaNewUser = new AnkietyzacjaMembershipUser();

            ankietyzacjaNewUser.user = newUser;
            ankietyzacjaNewUser.password = password;

            Roles.AddUserToRole(newUser.UserName, "Uzytkownicy");

            return ankietyzacjaNewUser;


        }



        public Int32 utworzUzytkownika(String uzytkownikId,
                                       String imie,
                                       String nazwisko,
                                       Int32 numerAlbumu,
                                       Int32 rokUkonczeniaStudiow,
                                       Int32 trybStudiowId
                                       )
        {
            String sql =
         @" INSERT INTO UZYTKOWNIK
                       (UZYTKOWNIK_ID, 
                        NUMERALBUMU, 
                        KONTOCZYNNE, 
                        ANKIETYZOWALNY, 
                        IMIE, 
                        NAZWISKO, 
                        TRYBSTUDIOW_ID, 
                        ROKUKONCZENIASTUDIOW) 
                VALUES (@UZYTKOWNIK_ID, 
                        @NUMERALBUMU, 
                        1, 
                        1, 
                        @IMIE, 
                        @NAZWISKO, 
                        @TRYBSTUDIOW_ID, 
                        @ROKUKONCZENIASTUDIOW); ";


            SqlCommand command = new SqlCommand(sql, connection, transaction);
            command.Parameters.Add(new SqlParameter("@UZYTKOWNIK_ID", uzytkownikId));
            command.Parameters.Add(new SqlParameter("@NUMERALBUMU", numerAlbumu));
            command.Parameters.Add(new SqlParameter("@IMIE", imie));
            command.Parameters.Add(new SqlParameter("@NAZWISKO", nazwisko));
            command.Parameters.Add(new SqlParameter("@TRYBSTUDIOW_ID", trybStudiowId));
            command.Parameters.Add(new SqlParameter("@ROKUKONCZENIASTUDIOW", rokUkonczeniaStudiow));

            return command.ExecuteNonQuery();

        }


        public DataTable loadForUserName (String userName) {
             
            String sql =
        @" SELECT *
             FROM aspnet_Users
     WHERE UserName = LOWER(@UserName);
     ";
            SqlCommand command = new SqlCommand(sql, connection, transaction);
            command.Parameters.Add(new SqlParameter("@UserName", userName));


            DataTable dataTable = new DataTable();

            new SqlDataAdapter(command).Fill(dataTable);

            return dataTable;

        }



        public String getUserName(String Imie, String nazwisko, String rokUkonczeniaStudiow)
        {

            String userName = Imie.Substring(0, 1) + '.' + nazwisko;

            DataTable user = loadForUserName(userName);

            if (user.Rows.Count == 0)
            {
                return userName;
            }

            userName = Imie.Substring(0, 1) + '.' + nazwisko + '.' + rokUkonczeniaStudiow;

            user = loadForUserName(userName);

            if (user.Rows.Count == 0)
            {
                return userName;
            }

            int i = 1;

            do
            {
                userName = Imie.Substring(0, 1) + '.' + nazwisko + i + '.' + rokUkonczeniaStudiow;
                user = loadForUserName(userName);
                if (user.Rows.Count == 0)
                {
                    return userName;
                }
                i++;

            } while (user.Rows.Count > 0);

            return Membership.GeneratePassword(8, 0);

        }




        public Int32 kopiujEmail(Int32 emailId)
        {
            String KopiujEmailSql =
         @" INSERT INTO EMAIL
           (TEMAT
           ,TRESC
           ,DATAWYSLANIA
           ,DATAUTWORZENIA)
    SELECT TEMAT
           ,TRESC
           ,NULL
           ,GETDATE()
      FROM EMAIL
     WHERE EMAIL_ID = @EMAIL_ID;
    SELECT scope_identity(); ";


            SqlCommand KopiujEmailCommand = new SqlCommand(KopiujEmailSql, connection, transaction);
            KopiujEmailCommand.Parameters.Add(new SqlParameter("@EMAIL_ID", emailId));

            return System.Convert.ToInt32(KopiujEmailCommand.ExecuteScalar());

        }

        public Int32 kopiujUzytkownikEmail(Int32 oldEmailId, Int32 newEmailId)
        {

            String KopiujUzytkownikEmailSql =
        @" INSERT INTO UZYTKOWNIK_X_EMAIL
           (UZYTKOWNIK_ID
           ,EMAIL_ID)
    SELECT UZYTKOWNIK_ID
           ,@EMAIL_ID_NEW
      FROM UZYTKOWNIK_X_EMAIL
     WHERE EMAIL_ID = @EMAIL_ID;
     ";


            SqlCommand KopiujUzytkownikEmailCommand = new SqlCommand(KopiujUzytkownikEmailSql, connection, transaction);
            KopiujUzytkownikEmailCommand.Parameters.Add(new SqlParameter("@EMAIL_ID", oldEmailId));
            KopiujUzytkownikEmailCommand.Parameters.Add(new SqlParameter("@EMAIL_ID_NEW", newEmailId));

            return KopiujUzytkownikEmailCommand.ExecuteNonQuery();

        }

        public Int32 updateDataWyslania(Int32 emailId)
        {

            String sql =
        @"  UPDATE EMAIL
           SET DATAWYSLANIA = GETDATE()
     WHERE EMAIL_ID = @EMAIL_ID;
     ";


            SqlCommand command = new SqlCommand(sql, connection, transaction);
            command.Parameters.Add(new SqlParameter("@EMAIL_ID", emailId));

            return command.ExecuteNonQuery();

        }




        public DataTable load(Int32 emailId)
        {

            String sql =
        @" SELECT *
             FROM EMAIL
     WHERE EMAIL_ID = @EMAIL_ID;
     ";
            SqlCommand sqlCommand = new SqlCommand(sql, connection, transaction);
            sqlCommand.Parameters.Add(new SqlParameter("@EMAIL_ID", emailId));


            DataTable dataTable = new DataTable();

            new SqlDataAdapter(sqlCommand).Fill(dataTable);

            return dataTable;

        }

        public DataTable loadAdresaci(Int32 emailId)
        {

            String sql =
        @" SELECT m.Email, x.EMAIL_ID, x.UZYTKOWNIK_ID, u.NUMERALBUMU, u.KONTOCZYNNE, u.ANKIETYZOWALNY, u.IMIE, u.NAZWISKO, u.TRYBSTUDIOW_ID, u.ROKUKONCZENIASTUDIOW
             FROM UZYTKOWNIK_X_EMAIL x, UZYTKOWNIK u, aspnet_Membership m
     WHERE x.UZYTKOWNIK_ID = u.UZYTKOWNIK_ID
       AND x.UZYTKOWNIK_ID = m.UserId
       AND x.EMAIL_ID = @EMAIL_ID;
     ";
            SqlCommand sqlCommand = new SqlCommand(sql, connection, transaction);
            sqlCommand.Parameters.Add(new SqlParameter("@EMAIL_ID", emailId));


            DataTable dataTable = new DataTable();

            new SqlDataAdapter(sqlCommand).Fill(dataTable);

            return dataTable;

        }




    }


}